package com.zp.self.module.level_4_算法练习.数学.数学推理;

/**
 * @author By ZengPeng
 */
public class 力扣_50_Pow_x_n {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_50_Pow_x_n().myPow(2.00000,10));
        System.out.println(new 力扣_50_Pow_x_n().myPow(2.10000,3));
        System.out.println(new 力扣_50_Pow_x_n().myPow(2.00000,-2));
        System.out.println(new 力扣_50_Pow_x_n().myPow(2.10000,0));
    }

    /**
    题目：实现 pow(x, n) ，即计算 x 的 n 次幂函数（即，xn ）。

     示例 1：
     输入：x = 2.00000, n = 10
     输出：1024.00000

     示例 2：
     输入：x = 2.10000, n = 3
     输出：9.26100

     示例 3：
     输入：x = 2.00000, n = -2
     输出：0.25000
     解释：2-2 = 1/22 = 1/4 = 0.25
                6        2 3    3         1
    分析：因为2   =  ( 2 )  = 4  = 4 * 16
       1.二分法：通过数学定理不断循环下去
            偶数直接：当前值相乘
            基数：   当前值相乘 * 当前值
            最后一次i=1 ,时会乘以前面所有值

    边界值 & 注意点：
       1. 0次方 = 1
       2. 总是多算了一次
     **/
    public double myPow(double x, int n) {
        double res = 1.0;//最终结果
        for (int i = n; i != 0; i=i/2) {
            if(i%2 !=0)
                res *=x;//奇数，每次取余时会漏一个数，需要乘起来，记录每次漏下的值。最后一次i=1 ,时会乘以前面所有值
            x *= x;//将新当前值赋予 x
        }
        return n>0?res :1/res; //为负数取倒数
    }
}
